﻿// Inner Fire 游戏引擎库
// Attacher - 附加组件
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 将项目附加到一个骨骼上面。用于武器等项目。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-06-12

#pragma once

#include <game/component/component.h>
#include <graphics/transform_def.h>

namespace ifire::game {
class Animator;
class Avatar;
class AvatarAttach;

class Attacher : public Component {
public:
  Attacher(GameObject* game_object);
  Attacher(const Attacher& lhs) = delete;
  Attacher& operator=(const Attacher& lhs) = delete;
  ~Attacher() override;

  // 设置附加的对象
  void AttachTo(GameObject* obj, ikit::sstr slot);
  // 设置是使用系统读取的项目，还是使用用户的项目
  void UseModify(bool enable) { use_modify_ = enable; }
  // 设置此Attach的项目，由用户调用，所以Rotation使用的是欧拉角（角度）
  void SetModify(IVec3 position, IVec3 rotation, IVec3 scale);
  // 返回默认的Adjust
  void GetAdjust(IVec3& position, IVec3& rotation, IVec3& scale) const;
  
  // 从Avatar的配置中调用项目
  void PickAdjust(IMat& fixed_mat);

  // 每帧更新
  void FixedUpdate(float delta_time) override;
  // 延迟更新
  void LateUpdate(float delta_time) override;
  

  // 获得此项目的类型
  static ikit::sstr ComponentType();
  // 获得Meta名称
  const char* GetMetaName() override;

private:
  // 此对象所附加到的对象
  GameObject* attach_to_;
  // 目标对象的Animator，没有Animator的对象无法附加
  Animator* animator_;
  // 目标对象的Avatar（方便操作
  const Avatar* avatar_;
  // 此项目附加在什么Slot上面
  ikit::sstr slot_name_;
  // 此项目的计算Attack
  const AvatarAttach* slot_;
  // 要从骨骼的矩阵中获得项目的ID
  int bone_id_;
  // 用于进行修正的Transform
  IMat modify_mat_;
  // 用于原始的矩阵（即这个项目一开始构建起Attach时的矩阵，以后都会乘这个矩阵）
  IMat4 origin_mat_;
  
  // 是否使用修正项目
  bool use_modify_;
};

} // namespace ifire::game